#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int N = 2e5 + 5; typedef pair<int, int> PII; typedef long long ll;
ll dis[105][105], f[105]; int n, m, k, e, dist[25]; int head[N], ver[N], net[N], edge[N], idx; priority_queue<PII, vector<PII>, greater<PII> > q; bool is[25][105], vis[25];
void add(int a, int b, int c) { net[idx] = head[a]; ver[idx] = b; edge[idx] = c; head[a] = idx++; }
int Dij(int x, int y)//最短路 { memset(dist, 0x3f, sizeof(dist)); memset(vis, 0, sizeof(vis)); for (int i = 1; i <= m; i++) for (int j = x; j <= y; j++) if (is[i][j]) vis[i] = true; q.push(make_pair(0, 1)), dist[1] = 0; while (!q.empty()) { int u = q.top().second; q.pop(); if (vis[u]) continue; vis[u] = true; for (int i = head[u]; ~i; i = net[i]) { int v = ver[i]; if (dist[v] > dist[u] + edge[i]) { dist[v] = dist[u] + edge[i]; q.push({dist[v], v}); } } } return dist[m]; }
int main() { memset(f, 0x3f, sizeof(f)); memset(head, -1, sizeof(head)); scanf("%d%d%d%d", &n, &m, &k, &e); for (int i = 1; i <= e; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); add(u, v, w), add(v, u, w); } int d; scanf("%d", &d); for (int i = 1; i <= d; i++) { int p, a, b; scanf("%d%d%d", &p, &a, &b); for (int i = a; i <= b; i++) is[p][i] = true; } for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) dis[i][j] = Dij(i, j); f[0] = -k; for (int i = 1; i <= n; i++) for (int j = 0; j < i; j++) f[i] = min(f[i], f[j] + (i - j) * dis[j + 1][i] + k); printf("%d", f[n]); }
|